package com.bida.service;

import com.bida.domain.dto.*;
import com.bida.domain.po.Orders;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bida.domain.vo.*;
import com.bida.result.PageResult;

/**
 * <p>
 * 订单表 服务类
 * </p>
 *
 * @author ly
 * @since 2024-09-08
 */
public interface IOrdersService extends IService<Orders> {

    /**
     * 用户下单
     * @param ordersSubmitDTO
     * @return
     */
    OrderSubmitVO userSubmitOrder(OrdersSubmitDTO ordersSubmitDTO);

    /**
     * 订单支付
     * @param ordersPaymentDTO
     * @return
     */
    OrderPaymentVO paymentOrder(OrdersPaymentDTO ordersPaymentDTO) throws Exception;


    /**
     * 支付成功，修改订单状态
     * @param outTradeNo
     */
    void paySuccess(String outTradeNo);

    /**
     * 历史订单查询
     * @param page
     * @param pageSize
     * @param status
     * @return
     */
    PageResult getHistoryOrders(int page, int pageSize, Integer status);

    /**
     * 查询订单详情
     * @param id
     * @return
     */
    OrderVO getOrdersInfoById(Long id);

    /**
     * 取消订单
     * @param id
     */
    void cancelOrderById(Long id) throws Exception;

    /**
     * 再来一单
     * @param id
     */
    void repetitionOrderAgain(Long id);

    /**
     * 订单搜索
     * @param ordersPageQueryDTO
     * @return
     */
    PageResult getOrdersPageConditionSearch(OrdersPageQueryDTO ordersPageQueryDTO);

    /**
     * 各个状态的订单数量统计
     * @return
     */
    OrderStatisticsVO getAllOrderStatistics();

    /**
     * 接单
     * @param id
     */
    void confirmOrdersById(Long id);

    /**
     * 拒单
     * @param ordersRejectionDTO
     */
    void rejectionOrdersByIdReason(OrdersRejectionDTO ordersRejectionDTO) throws Exception;

    /**
     * 取消订单
     * @param orderCancelDTO
     */
    void cancelOrderByIdReason(OrdersCancelDTO orderCancelDTO);

    /**
     * 派送订单
     * @param id
     */
    void deliveryOrderById(Long id);

    /**
     * 完成订单
     * @param id
     */
    void completeOrderById(Long id);

    /**
     * 用户催单
     * @param id
     */
    void userReminder(Long id);
}
